package com.lxu.service;

import com.lxu.entity.ReportDataEntity;
import com.lxu.entity.ReportDirEntity;
import com.lxu.entity.bo.ReportTableBO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * word报表工具 服务类
 */
@Service("wew15")
public class WordTemplateService {

    @Autowired
    private TemplateQueryService templateQueryService;

    @Autowired
    private WordTemplateFillService wordTemplateFillService;

    @Autowired
    private TemplateDataAssembleService templateDataAssembleService;

    @Autowired
    private WordCombineService wordCombineService;

    /**
     * 按照数据库预置模板顺序，填充模板数据，并合并
     * <p>
     * 1、根据模板编号，拉取报告模板目录，并复制到客户对应的报告表中;
     * 2、获取模板配置对应的数据，形成最终的数据模型；
     * 3、填充拉取的报告模板；
     * 4、合并报告模板；
     *
     * @param reportDataEntity 实际 报表模板
     */
    public void exportWordTemplate(OutputStream out, ReportDataEntity reportDataEntity) throws Exception {
        /**
         * 1、根据模板编号，拉取报告模板目录;
         */
        reportDataEntity = templateQueryService.queryReportData(reportDataEntity);
        /**
         * 2、获取模板配置对应的数据，形成最终的数据模型；
         */
        List<ReportDirEntity> dirs = templateQueryService.queryReportDirs(reportDataEntity);
        if (CollectionUtils.isEmpty(dirs)) {
            return;
        }
        for (ReportDirEntity dir : dirs) {
            Map<String, Object> templateTextMap = new HashMap<>();
            Map<String, List<List<String>>> templateTableMap = new HashMap<>();
            List<ReportTableBO> templateTables = new ArrayList<>();

            /**
             * 调用模板数据组装接口
             */
            templateDataAssembleService.generateTemplateData(dir, templateTextMap, templateTableMap, templateTables);

            /**
             * 调用数据填充接口
             */
            wordTemplateFillService.fill(dir, templateTextMap, templateTables);
        }

        /**
         * 组装填充后的模板
         */
        List<File> srcfiles = new ArrayList<File>();
        for (ReportDirEntity dir : dirs) {
            srcfiles.add(new File(dir.getDestFilePath()));
        }
        wordCombineService.combine(reportDataEntity.getReportAddr(), srcfiles);

        /**
         *导出
         */
        File file = new File(reportDataEntity.getReportAddr());
        InputStream inputStream = new FileInputStream(new File(reportDataEntity.getReportAddr()));
        new XWPFDocument(inputStream).write(out);
    }
}
